package main

import "fmt"

/**
接口类型变量：
实现了接口有什么用呢？

接口类型变量能够存储所有实现了该接口的实例。

*/

// “说话者”95_接口，包含一个声明的方法Say()
type Sayer interface {
	Say()
}

// 定义Cat结构体并在其上实现方法Say()，那么Cat实现了接口Sayer
type Cat struct{}

func (c Cat) Say() {
	fmt.Println("喵喵喵")
}

// 定义Dog结构体并在其上实现方法Say()，那么Dog实现了接口Sayer
type Dog struct{}

func (d Dog) Say() {
	fmt.Println("汪汪汪")
}

func main() {
	var x Sayer
	a := Cat{} // 实例化一个Cat
	b := Dog{} // 实例化一个Dog

	x = a   // 可以把Cat实例直接赋值给x
	x.Say() // 喵喵喵
	x = b   // 可以把Dog实例直接赋值给x
	x.Say() // 汪汪汪

}
